#include<iostream>
#include<vector>
#include<unistd.h>
#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>


typedef void (*task)(); //函数指针类型
std::vector <task> task_s;//函数指针数组

void fun1()
{
    printf("临时任务1\n");
}

void fun2()
{
    printf("临时任务2\n");
}


// 设置对应的方法回调
// 以后想让父进程闲了执行任何方法的时候，只要向Load里面注册，就可以让父进程执行对应的方法
void load()
{
    task_s.push_back(fun1);
    task_s.push_back(fun2);
}


int main()
{
   pid_t id=fork();
   if(id==0)
   {
    int count=5;
    while(count)
    {
     printf("count:%d 我是子进程，pid:%d ppid:%d\n",count--,getpid(),getppid());
     sleep(1);
    }
    exit(15);
   }
   else
   {
   int quit =0;
   while(!quit)
   {
       int status =0;
      pid_t ret =waitpid(id,&status, WNOHANG);
      if(ret>0)
      {
       //等待成功 && 子进程退出
      printf("等待子进程成功,子进程退出码:%d\n",WEXITSTATUS(status));
      quit=1;
      }
      else if(ret ==0)
      {
          //等待成功 && 但子进程并未退出
        printf("子进程还在运行中，暂时还没有退出，父进程可以在等一等, 处理一下其他事情？？\n");
          if(task_s.empty())  load();
              for(auto iter : task_s)
              {
                  //执行临时任务
                  iter();
                  }
      }
      else
      {
       printf("wait失败\n");
       quit=1;
      }
      sleep(1);
   }
   }







   //{
   //    int status =0;
   //    pid_t ret=waitpid(id,&status,0);// 默认是在阻塞状态去等待子进程状态变化

   //    // pid_t waitpid(pid_t pid, int *status, int options);
   //    //id==-1,等待任意子进程退出，等价于wait()
   //    //id>0,等待指定进程退出
   //    //options 默认为0，代表阻塞等待, WNOHANG: 叫做非阻塞等待
   //    if(ret>0)
   //    {
   //        if(WIFEXITED(status))
   //        {
   //          printf("子进程执行完毕，子进程退出码:%d\n",WEXITSTATUS(status));
   //        }
   //        else
   //        {
   //        printf("程序崩溃，子进程异常退出\n");
   //        }
   //    }
   //}
    return 0;
}
